package chainOfResponsibilityPattern

/**
 * 责任链模式:
 * 使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止.
 *
 * 角色:
 * 抽象处理者(Handler):该角色对请求进行抽象,并定义一个方法以设定和返回下一个处理者的引用.
 * 具体处理者(Concrete Handler):该角色接到请求后,可以选择将请求处理掉,或者将请求传给下一个处理者,由于具体的处理者持有对下一个处理者的引用,
 * 因此,如果需要,具体处理者可以访问下一个处理者.
 *
 * 优点:
 * 责任链模式将请求和处理分开,请求者不知道是谁处理的,处理者可以不用知道请求的全貌.
 * 提高系统的灵活性.
 *
 * 缺点:
 * 责任链过长的时候会降低程序的性能.
 * 不易于调试.
 *
 * 举个栗子:
 * 开发完成后的测试阶段,测试人员相当于责任链请求的发起者,前端开发和后台开发相当于责任链的责任节点,当测试发现一个bug的时候.
 * 首先会把bug提交到前端开发人员那里,前端开发人员查看bug后,如果是前端的问题就直接解决掉了,不再往下分发.如果不是前端的问题的话,
 * 就会把bug往下分发到后台开发人员那里.对于测试人员来说,只需要关心bug有没有解决,对于每个责任节点只需要关心自己能解决的bug.
 */
fun main() {
    sendBug("测试:提交一个bug")
}

fun sendBug(s: String) {
    PrintUtil.print(s)

    //先设置责任链
    val android = ConcreteHandler("Android")
    val background = ConcreteHandler("后台")
    android.setNext(background)

    //责任链开始
    android.handleRequest()
}
